package redisutil

import (
	"fmt"

	"gitee.com/night-tc/gobige/global"
	"gitee.com/night-tc/gobige/redislib"
)

/*
唯一登录标识
用于确保每个用户在同一时间只能登录一个角色
*/
type OnceLogin struct {
	key string
	// 获取redis操作的方法
	getRedisF func() *redislib.RedisHandleModel
}

func NewOnceLogin(userID uint64) *OnceLogin {
	return &OnceLogin{
		key:       fmt.Sprintf("OnceLogin:%d", userID),
		getRedisF: global.GetRedisAccess(global.RedisName_Session).GetConn,
	}
}

// GetSetPlayerID 设置新的玩家ID，并返回之前的玩家ID
// 如果之前没有设置过玩家ID，则返回0和nil错误
func (this *OnceLogin) GetSetPlayerID(playerID uint64) (uint64, error) {
	// 获取redis连接
	rd := this.getRedisF()

	defer rd.Expire(rd.Ctx, this.key, global.Expire3Day)
	// 尝试设置玩家ID
	result, err := rd.GetSet(rd.Ctx, this.key, playerID).Uint64()
	// 返回值和错误
	return result, err
}

// 刷新过期时间
func (this *OnceLogin) Expire() {
	c := this.getRedisF()
	c.Expire(c.Ctx, this.key, global.Expire3Day)
}
